﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.AccesoDatos;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Onshi.POS.Modelo.Entidades.Tipos;

namespace Onshi.POS.Repositorios
{
    public class RepositorioUsuarios : RepositorioEntidad<Usuario, Int32, IServicioDatosUsuarios>
    {
        #region Constructores

        public RepositorioUsuarios()
            : base()
        {

        }

        #endregion

        #region Atributos

        private RepositorioPerfiles repositorioPerfiles = new RepositorioPerfiles();

        #endregion

        #region Metodos

        public override Usuario DevolverPorId(Int32 id)
        {
            var usuario = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (usuario == null)
                using (var ds = servicioDatos.Usuarios_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        usuario = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(usuario);
                    }
            return usuario;
        }

        public Usuario DevolverPorNombre(String nombre)
        {
            Usuario usuario = null;
            using (var ds = servicioDatos.Usuarios_DevolverPorNombre(nombre))
                if (ds.Tables[0].Rows.Count > 0)
                {
                    usuario = FilaAEntidad(ds.Tables[0].Rows[0]);
                    entidades.Add(usuario);
                }
            return usuario;
        }

        public List<Usuario> DevolverTodos()
        {
            using (var ds = servicioDatos.Usuarios_DevolverTodos())
                entidades = TablaALista(ds.Tables[0]);
            return entidades;
        }

        public void Insertar(Usuario usuario)
        {
            usuario.Id = servicioDatos.Usuarios_Insertar(usuario.Perfil.Id, usuario.Nombre, usuario.Clave, usuario.Observaciones);
        }

        public void Modificar(Usuario usuario)
        {
            servicioDatos.Usuarios_Modificar(usuario.Id, usuario.Perfil.Id, usuario.Nombre, usuario.Clave, usuario.Observaciones, usuario.EstaEliminado);
        }

        protected override Usuario FilaAEntidad(DataRow fila)
        {
            var usuario = new Usuario();
            usuario.Id = (Int32)fila["IdUsuario"];
            usuario.Nombre = (String)fila["Nombre"];
            usuario.Clave = (String)fila["Clave"];
            usuario.Observaciones = (String)fila["Observaciones"];
            usuario.EstaEliminado = (Boolean)fila["EstaEliminado"];
            usuario.Perfil = repositorioPerfiles.DevolverPorId((Int32)fila["IdPerfil"]);
            return usuario;
        }

        public void ModificarPerfil(Perfil perfilNuevo, Perfil perfilViejo)
        {
            servicioDatos.Usuarios_ModificarPerfil(perfilNuevo.Id, perfilViejo.Id);
        }

        #endregion
    }
}
